// 定义辅助函数
import axios from "axios";

// 记录当前处于 pengding 状态的请求
const pendingRequest = new Map();

// 用于根据当前请求的信息，生成请求 Key
function generateReqKey(config) {
  if (config) {
    const { method, url, params, data, __retryCount } = config;
    // console.log(__retryCount);
    return [
      method,
      url,
      JSON.stringify(params),
      JSON.stringify(data),
      __retryCount,
    ].join("&");
  }
}

// 用于把当前请求信息添加到pendingRequest对象中
function addPendingRequest(config) {
  const requestKey = generateReqKey(config);
  config.cancelToken =
    config.cancelToken ||
    new axios.CancelToken((cancel) => {
      if (!pendingRequest.has(requestKey)) {
        pendingRequest.set(requestKey, cancel);
      }
    });
}

// 检查是否存在重复请求，若存在则取消已发的请求
function removePendingRequest(config) {
  const requestKey = generateReqKey(config);
  if (pendingRequest.has(requestKey)) {
    const cancelToken = pendingRequest.get(requestKey);
    cancelToken(requestKey);
    pendingRequest.delete(requestKey);
  }
}

// 请求重发封装
function requestAgainSend(error, instance) {
  console.log([error]);
  let config = error.config;
  // config.retry 具体接口配置的重发次数
  if (!config || !config.retry) return Promise.reject(error);

  // 设置用于记录重试计数的变量 默认为0
  config.__retryCount = config.__retryCount || 0;

  // 判断是否超过了重试次数
  if (config.__retryCount >= config.retry) {
    return Promise.reject(error);
  }
  // 重试次数
  config.__retryCount += 1;
  // 延时处理
  let backoff = new Promise(function (resolve) {
    setTimeout(function () {
      resolve();
    }, config.retryDelay || 1000);
  });
  // 重新发起axios请求
  return backoff.then(function () {
    // 判断是否是JSON字符串
    // TODO: 未确认config.data再重发时变为字符串的原因
    // if (config.data && isJsonStr(config.data)) {
    //     config.data = JSON.parse(config.data);
    // }
    return instance(config);
  });
}

export {
  generateReqKey,
  addPendingRequest,
  removePendingRequest,
  requestAgainSend,
};
